import axios from 'axios'

// --- 模拟数据开关 ---
const USE_MOCK_API = false // 在这里切换 true (模拟) / false (真实)

// --- 真实 API 配置 (仅在 USE_MOCK_API = false 时使用) ---
const apiClient = axios.create({
  baseURL: '',
  timeout: 5000,
  headers: {
    Accept: 'application/json, text/plain, */*',
  },
})

// --- 请求拦截器 ---
apiClient.interceptors.request.use(
  (config) => {
    console.log('[DEBUG] 请求拦截器 - 完整配置:', {
      url: config.url,
      method: config.method,
      headers: config.headers,
      data: config.data instanceof FormData ? 'FormData' : config.data,
    })

    // 添加完整URL的调试信息
    console.log('[DEBUG] 请求拦截器 - 完整URL:', config.baseURL + config.url)
    console.log(
      '[DEBUG] 请求拦截器 - 代理目标URL:',
      'http://localhost:8081' + config.url.replace(/^\/api/, ''),
    )

    // 特别输出 Content-Type
    console.log('[DEBUG] 请求拦截器 - Content-Type:', config.headers['Content-Type'])

    // 从 localStorage 获取 token
    const token = localStorage.getItem('satoken')
    console.log('[DEBUG] 请求拦截器 - 从localStorage获取的token:', token)

    // 如果有 token，添加到请求头
    if (token) {
      config.headers['satoken'] = token
    }

    // 再次输出最终的请求头
    console.log('[DEBUG] 请求拦截器 - 最终请求头:', config.headers)

    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

// --- 响应拦截器 ---
apiClient.interceptors.response.use(
  (response) => {
    console.log('[DEBUG] 响应拦截器 - 完整响应:', {
      status: response.status,
      statusText: response.statusText,
      headers: response.headers,
      data: response.data,
    })
    return response
  },
  (error) => {
    console.log('[DEBUG] 响应拦截器 - 错误详情:', {
      status: error.response?.status,
      statusText: error.response?.statusText,
      headers: error.response?.headers,
      data: error.response?.data,
    })
    return Promise.reject(error)
  },
)

// --- 模拟 API 函数 (与之前相同) ---
const mockLogin = (credentials) => {
  /* ...之前的模拟登录代码... */
  console.log('[MOCK API] 接收到登录请求:', credentials)
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (credentials.email === '3293583323@qq.com' && credentials.password === '123456') {
        // 模拟登录成功
        console.log('[MOCK API] 模拟登录成功')
        resolve({
          // 返回模拟的 Axios 响应结构
          data: {
            // 模拟后端返回的 data 字段
            // ---> 关键：模拟与后端一致的响应体结构 <---
            code: 0,
            msg: null,
            data: {
              tokenName: 'satoken', // 可以保持固定或模拟
              tokenValue: 'mock-satoken-value-success-12345', // 提供一个模拟 token
              isLogin: true,
              loginId: 'mockUser123', // 提供一个模拟的用户 ID
              loginType: 'login',
              tokenTimeout: 2591999, // 可以随意写，前端通常不用
              sessionTimeout: 2591999,
              tokenSessionTimeout: -2,
              tokenActiveTimeout: -1,
              loginDevice: 'mock-device-fingerprint', // 可以模拟
              tag: null,
            },
            // ---> 结构模拟结束 <---
          },
        })
        reject({
          response: { status: 500, data: { code: 500, msg: '模拟服务器内部错误', data: null } },
        })
      } else {
        // 模拟登录失败
        console.log('[MOCK API] 模拟登录失败')
        resolve({
          // 模拟后端返回的业务错误响应
          data: {
            code: 1, // 或者其他非 0 的错误码
            msg: '模拟错误：邮箱或密码不正确',
            data: null, // 失败时 data 通常为 null
          },
        })
        // 模拟服务器错误示例:
        // reject({ response: { status: 500, data: { code: 500, msg: '模拟服务器内部错误', data: null } } });
      }
    }, 800) // 模拟延迟
  })
}

const mockRegister = (userData) => {
  // 兼容 FormData 和普通对象
  let logObj = userData
  if (userData instanceof FormData) {
    logObj = {}
    userData.forEach((v, k) => {
      logObj[k] = v
    })
  }
  console.log('[MOCK API] 接收到注册请求:', logObj)
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('[MOCK API] 模拟注册成功')
      resolve({
        data: {
          code: 0,
          msg: null,
          data: '用户注册成功',
        },
      })
    }, 600)
  })
}

const mockFetchUserProfile = () => {
  /* ...之前的模拟获取用户信息代码... */
  console.log('[MOCK API] 请求用户信息')
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('[MOCK API] 返回模拟用户信息')
      resolve({
        data: { id: 1, username: 'MockUser', email: 'test@example.com', role: 'user' },
      })
    }, 400)
  })
}

const mockFetchUserProfileById = (id) => {
  console.log(`[MOCK API] 请求用户 #${id} 的信息`)
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(`[MOCK API] 返回模拟用户 #${id} 的信息`)
      resolve({
        data: {
          code: 0,
          msg: null,
          data: {
            id: id,
            nickname: `用户${id}`,
            photo: `https://api.dicebear.com/7.x/miniavs/svg?seed=${id}`,
            // 还可以添加其他模拟的公开信息
          },
        },
      })
    }, 400)
  })
}

// --- 模拟发帖 ---
const mockCreatePost = (postData) => {
  console.log('[MOCK API] 接收到发帖请求:', postData)
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        data: {
          code: 0,
          msg: null,
          data: { postId: Math.floor(Math.random() * 10000) },
        },
      })
    }, 600)
  })
}

// --- 真实的 API 调用函数 (补充回来！) ---
// 【重要】确保这里的接口路径 '/auth/login', '/auth/register', '/users/me' 与你后端实际接口匹配

const realLogin = (credentials) => {
  console.log('[REAL API] 发送登录请求到 /api/user/login')
  return apiClient.post('/api/user/login', credentials, {
    headers: {
      'Content-Type': 'application/json',
    },
  })
}

const realRegister = (userData) => {
  console.log('[DEBUG] 注册请求 - 原始数据:', userData)
  console.log(
    '[DEBUG] 注册请求 - 数据类型:',
    userData instanceof FormData ? 'FormData' : '普通对象',
  )

  // 判断是否为 FormData
  if (userData instanceof FormData) {
    console.log('[DEBUG] 注册请求 - FormData内容:')
    userData.forEach((value, key) => {
      console.log(`[DEBUG] ${key}:`, value)
    })

    return apiClient.post('/api/user/register', userData, {
      // 修改为带/api前缀
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    })
  } else {
    return apiClient.post('/api/user/register', userData) // 这里也要修改
  }
}

const realFetchUserProfile = () => {
  console.log('[REAL API] 发送获取用户信息请求到 /users/me')
  return apiClient.get('/users/me')
}

// 新增：根据ID获取用户公开信息
const realFetchUserProfileById = (id) => {
  // 注意：这个 /api/user/{id} 接口是基于通用设计惯例的推断，文档中未明确提供
  console.log(`[REAL API] 发送获取用户公开信息请求到 /api/user/${id}`)
  return apiClient.get(`/api/user/${id}`)
}

// --- 真实发帖 ---
const realCreatePost = (postData) => {
  console.log('[REAL API] 发送发帖请求到 /api/api/posts')
  return apiClient.post('/api/api/posts', postData)
}

// 新增：获取帖子列表
const realFetchPosts = (params) => {
  // params: { page, size, sort }
  return apiClient.get('/api/api/posts', { params })
}

// 新增：获取帖子详情
const realFetchPostDetail = (id) => {
  return apiClient.get(`/api/api/posts/${id}`)
}

// 新增：获取评论列表
const realFetchComments = (postId, page = 1, size = 10) => {
  return apiClient.get(`/api/api/posts/${postId}/comments`, { params: { page, size } })
}

// 新增：发表评论
const realAddComment = (data) => {
  // data: { postId, content, parentId }
  return apiClient.post('/api/api/comments', data)
}

// 新增：点赞帖子
const realLikePost = (postId) => {
  return apiClient.post(`/api/api/posts/${postId}/like`)
}

// 新增：点赞评论
const realLikeComment = (commentId) => {
  return apiClient.post(`/api/api/comments/${commentId}/like`)
}

// 获取当前用户信息
const getUserInfo = () => {
  return apiClient.get('/api/user/getUserInfo')
}

// 获取其他用户信息（通过nickname）
const getOtherInfo = (nicknameOrObj) => {
  const data = typeof nicknameOrObj === 'string' ? { nickname: nicknameOrObj } : nicknameOrObj
  return apiClient.post('/api/user/getOtherInfo', data, {
    headers: { 'Content-Type': 'application/json' },
  })
}

// 获取历史聊天消息
const historyMessage = (data) => {
  return apiClient.post('/api/chat/historyMessage', data)
}

// 获取会话用户列表
const getInterlocutor = (userId) => {
  return apiClient.get(`/api/chat/getInterlocutor/${userId}`)
}

// 人脸识别接口
const faceRecognition = (formData) => {
  return apiClient.post('/api/user/faceRecognition', formData, {
    headers: { 'Content-Type': 'application/json' },
  })
}

// --- 导出 API 函数 ---
// 根据 USE_MOCK_API 的值，导出对应的函数
const api = {
  login: USE_MOCK_API ? mockLogin : realLogin,
  register: USE_MOCK_API ? mockRegister : realRegister,
  fetchUserProfile: USE_MOCK_API ? mockFetchUserProfile : realFetchUserProfile,
  createPost: USE_MOCK_API ? mockCreatePost : realCreatePost,
  fetchPosts: realFetchPosts,
  fetchPostDetail: realFetchPostDetail,
  fetchComments: realFetchComments,
  addComment: realAddComment,
  likePost: realLikePost,
  likeComment: realLikeComment,
  fetchUserProfileById: USE_MOCK_API ? mockFetchUserProfileById : realFetchUserProfileById,
  getUserInfo,
  getOtherInfo,
  historyMessage,
  getInterlocutor,
  faceRecognition,
}

export default api
